#ifndef _sensors_c__ruffi__eurobot08_
#define _sensors_c__ruffi__eurobot08_
#include <avr/io.h>

void init_sensors( void ) {
	DDRC = 0x00; /*vsecky vstupni*/
	PORTC = 0xff; /*pull-up odpory*/
	DDRA = 0x00; /*vsecky vstupni*/
	PORTA = 0xff; /*pull-up odpory*/
	DDRB &= ~(1<<PB1 | 1<<PB2 | 1<<PB7); /* PB1, PB2 a PB7 vstupni */
	PORTB |= (1<<PB1 | 1<<PB2 | 1<<PB7); /* pull-up odpor */
}


/* sepnuto, kontakt,.. = 0; jinak = 1*/

/* narazniky */
int get_front_left( void ) {
	return (( PINA & 0x40 )>>6);
}

int get_front_right ( void ) {
	return (( PINA & 0x80 )>>7);
}

int get_front_left_high ( void ) {
	return (( PINA & 0x10 )>>4);
}

int get_front_right_high ( void ) {
	return (( PINA & 0x20 )>>5);
}

int get_rear_left ( void ) {
	return (( PINC & 0x02 )>>1);
}

int get_rear_right ( void ) {
	return ( PINC & 0x01 );
}

/* tri funkce na stav plechovek od piva,
* ktere slouzi jako spinace pri sbirani
* micku
*/
int get_left_lift ( void ) {
	return (( PINC & 0x04 )>>2);
}

int get_center_lift ( void ) {
	return (( PINC & 0x08 )>>3);
}

int get_right_lift ( void ) {
	return (( PINC & 0x10 )>>4);
}

/* micek spadl dovnitr */
/* pozor, spinac pri sepnuti rozepne! -> je to spravne */
int get_ball_inside ( void ) {
	return (( ~PINC & 0x40 )>>6);
}

/* micek vypadl ven */
int get_ball_outside ( void ) {
	return ((PINC & 0x20)>>5);
}

/* tycka vepredu vpravo na otevreni vodorovneho kontejneru */
int get_finger ( void ) {
	return (( PINC & 0x80 )>>7);
}

/* senzor se kalibruje pridrzenim micku
* pred senzorem a dlouhym stisknutim,
* dokud senzor sviti. Pak se znovu stiskne.
* kdyz sviti cervena.
* Tim se nastavi spravny mod.
* Pak, kdyz kolem projede micek te barvy,
* senzor vysle dlouhy signal.
* pokud tam projede micek jine barvy,
* nebude signal zadny.
* Ovsem jelikoz jsou micky derave,
* nelze na to vzdy spolehat, a obcas projede
* dovnitr i bily micek, coz je spravne,
* takze to funguje celkem dobre.
*/
int get_color_sensor ( void ) {
	return (( PINA & 0x08 )>> 3);
}
/* radary */
int get_left_radar ( void ) {
	return (( PINB & 0x04 )>> 2);
}

int get_right_radar ( void ) {
	return (( ~PINB & 0x02 ) >> 1);
}

/*startovaci lanko*/
/* 0 - zastrcene, 1 - vytahle */
int get_start ( void ) {
	return (( PINB & 0x80 ) >>7);
}

/* binarni volic 
*     0 az 7
*/
int get_choice ( void ) {
	return ( PINA & 0x07 );
}

#endif
